#列表的创建
"""a = [10,20,30,40]
b = [10,12,"郝建成",True,1.1]
c = []
d = list() #通过List()方法创建空列表
e = list(range(10))
print(a)
print(b)
print(c)
print(d)
print(e)"""

"""#通过推导式生成列表
nums = [i for i in range(10)] #todo：推导式生成列表
print(nums)

#如果是正常写列表需要三行
nums_1 = []
for i in range(10):
    nums_1.append(i) #在nums_1列表后面追加元素
print(nums_1)"""

# 列表的内置方法  todo：列表支持索引
# append todo：末尾追加函数
nums = [10,20,30,40]
# nums.append("郝建成")
# nums.append("琳姐")
# print(nums)
# 指定 todo:指定索引位置新增
# nums.insert(0,"郝建成")
# nums.insert(0,"王琳琳")
# nums.insert(1,"丁莹")
# print(nums) #["王琳琳","丁莹","郝建成"]
#删除具体的值
"""print(nums)
result = nums.remove(40) # 用remove删除方法，返回值是None,表示没有返回值
print(result)"""
#根据索引位置删除元素
"""result = nums.pop(1)
# print(nums)
print(result) # 使用pop删除的是索引"""
# 根据del方法删除
"""del nums[0]
print(nums)"""
# 修改列表元素内容
# print(nums[0])
# nums[0] = "郝建成Plus"
# print(nums)
# 查看列表内容
student = ["郝建成","郝建成1号","好健康","美年大健康","健康","成长"]
# 切片访问
# 从左开始      0        1          2       3        4       5
#            -6       -5       -4       -3        -2     -1
# print(student)
"""print(student[0:3])
print(student[2:5])
print(student[1:5])
print(student[1:])"""
# todo:倒序返回
# print(student[::-1])

# 遍历访问list对象,用for循环
"""for i in student:
    print(i)
"""
# 遍历访问list对象，用for循环 todo：通过索引方式
# print(len(student)) # 6
# for i in range(len(student)):
#     print(student[i]) # todo：注意一下
# 遍历访问List对象，用while循环
"""num = 0
while num < len(student):
    print(student[num])
    num += 1"""

# 列表推导式案例
# 创建一个10以内的偶数列表
"""nums_ou = [i for i in range(10) if i % 2 == 0]
print(nums_ou)
"""
# todo:创建一个元素
"""nums2 = [(x,y) for x in range(5,10) for y in range(10,20)]
print(nums2)"""

#上例的另种形式
"""num2_1 = []
for x in range(5,10):
    for y in range(10,20):
        num2_1.append((x,y))
print(num2_1)"""
# todo：列表推导式
# ts_file = ['2.ts','3.ts','4.ts','5.ts']
# # 变成字符串的数字
# s1 = [i.replace('.ts', "") for i in ts_file]
# print(s1)
# # 变成整数
# s2 = [int(i.replace('.ts',"")) for i in ts_file]
# print(s2)
# # todo:对产生整数的列表进行排序
# l1 = [99,109,65,12,555]
# print(sorted(l1, reverse=True)) # reverse默认值是False，升序；如果是True就是降序
# print(sorted(l1)) # todo:默认是升序排序
# print(l1) # todo：但是原来的列表是不会变的
# print(ts_file)
# nums_2 = sorted([int(i.replace('.ts' , "")) for i in ts_file])  # todo：稍显复杂
# print(nums_2)

# todo:reversed :倒序方法
# l2 = [99,109,65,12,555]
# print(reversed(12)) # 直接返回的是迭代器对象地址
# print(list(reversed(l2))) # todo:如果想要看倒序的列表内容，需要强制转换成列表对象才可以
# print(l2[::-1]) # 上面的reversed方法等同于这个

# 列表内部元素清空
# l3 = [10,20,30]
# del l3 # 直接把列表删除掉了
# print(l3) # 报错了 not defined
# l3.clear() # 清空列表所有元素，但是列表还在
# print(l3)

# 列表统计元素出现的次数
list_obj = [10,10,20,20,33,44,55,66,11,223,44]
"""print(list_obj.count(10)) # count 里面传递的是要看哪个出现几次
print(list_obj.count(33)) # count 里面传递的是要看哪个出现几次"""
# list_obj.append(100)
# print(list_obj)

# 判断元素是否存在于列表内
"""if "沈腾" in list_obj:
    print("沈腾在列表里")
else:
    print("沈腾不在列表里")"""
"""if 10 in list_obj:
    print("10在列表里")
else:
    print("10不在列表里")"""

# 列表相求最大值
"""print(max(list_obj)) # 223"""

# 列表相求最小值
"""print(min(list_obj))"""

# 列表求和
"""print(sum(list_obj))"""

# 列表总结
"""
因为列表可以进行增删改，所以列表是可变的数据类型

像是int类型整数，是一个常量，常量都是不可变的数据类型

昨天学过的str字符串，也是不可变的数据类型
"""
# 从使用上来说，可变和不可变的区别
"""str_obj = "郝建成"
str_obj[0] = "张"
print(str_obj) # str 不可改变 TypeError: 'str' object does not support item assignment
"""
"""num_4 = [10,20,30]
num_4[0] = "郝建成"
print(num_4)"""

# 从底层来看，可变和不可变的区别
# 不可变的数据类型，两个变量值相同，占用的地址空间是一样的
# 【1】 int类型
"""a1 = 10
b1 = 10
print(id(a1))
print(id(b1))"""
# 【2】 str类型
"""a_str = "郝建成1号"
b_str = "郝建成1号"
print(id(a_str))
print(id(b_str))"""
# 可变的数据类型，即使变量值相同，地址空间也不会相同
"""a_list = [10.20,30]
b_list = [10.20,30]
print(id(a_list))
print(id(b_list))"""

# 列表浅复制，复制出来的id地址值是一样的 todo：浅复制和浅拷贝不是一回事
x = [100,200,300]
y = x # 声明了一个y变量，通过x赋值的
x[0] = 1 # x = [1,200,300]
print(y)
print(id(x),id(y)) # 2100073968640 2100073968640

# 复制一个新的列表
b_list = x.copy() # 通过x列表复制一个列表出来
print(b_list) # [100.200,300]
print(id(x),id(b_list)) # 2206677185536 2206677509440

# 深拷贝
import copy
bb_list = x.copy()
aa_list = copy.copy(x)
print(aa_list)
print(id(aa_list),id(x)) # 2051615215808 2051614880640